#include <iostream>

void print() { std::cout << '\n'; }

template <typename T, typename... Args>
void print(const T &first, const Args &...rest)
{
    std::cout << first << ' ';
    print(rest...);
}

int main()
{
    print(1, 2.5, "hello", 'c');
    return 0;
}
// 模板递归重载: 不是一次传完，而是一层一层剥

// 构建过程如下
// print(1, 2.5, "hello", 'c');
// → 实例化出
// void print<int,double,const char*,char>(1, 2.5, "hello", 'c')
// {
//     std::cout << 1 << ' ';
//     print(2.5, "hello", 'c');          // 还剩 3 个
// }

// print(2.5, "hello", 'c')
// → 实例化出
//    void print<double,const char*,char>(2.5, "hello", 'c')
// {
//     std::cout << 2.5 << ' ';
//     print("hello", 'c');               // 还剩 2 个
// }

// print("hello", 'c')
// → 实例化出
//    void print<const char*,char>("hello", 'c')
// {
//     std::cout << "hello" << ' ';
//     print('c');                        // 还剩 1 个
// }

// print('c')
// → 实例化出
//    void print<char>('c')
// {
//     std::cout << 'c' << ' ';
//     print();                           // **0 个实参**，匹配到无参版本
// }

// 无参版本就是“递归终止条件”
// void print() { std::cout << '\n'; }